package cn.vehicle.domains.vo.res.zs;

import cn.vehicle.enums.InternalIOValueEnum;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

import java.util.List;

@Data
public class AlarmInfoPlate {

    /**
     * 回复 ok 开闸
     */
    private String info;
    /**
     * 当前车牌 id
     */
    private Integer plateid;
    /**
     * 回复开闸端口号，若无，则默认为 0
     */
    private Integer channelNum;
    /**
     * 回复 ok 进行手动触发
     */
    private String manualTrigger;
    /**
     * 截图选项。可选，不触发截图可不添加该字段
     */
    @JsonProperty("TriggerImage")
    private TriggerImage TriggerImage;
    /**
     * 没备注。猜测回复ok会有支付成功的提示信息
     */
    private String is_pay;
    /**
     * 回复串口数据可以发送到相应串口
     */
    private List<SerialData> serialData;

    /**
     * 系统预置语音播报
     */
    private PlayServer playserver_json_request;
    /**
     * 输出 IO 控制
     */
    private IOCtrl ivs_ioctrl;

    @Data
    public static class TriggerImage {
        /**
         * 回复截图内容端口号（可选，不填则默认使用 http 页面配置端口）
         */
        private Integer port;
        /**
         * 回复截图内容相对路径（可选，不触发截图可不添加该字段）
         */
        private String snapImageRelativeUrl;
        /**
         * 回复截图内容绝对路径（可选，不触发截图可不添加该字段）
         */
        private String snapImageAbsolutelyUrl;
    }


    @Data
    public static class SerialData {
        /**
         * 串口号
         */
        private Integer serialChannel;
        /**
         * 回复数据
         */
        private String data;
        /**
         * 数据长度
         */
        private Integer dataLen;
    }


    @Data
    public static class PlayServer {
        /**
         * ps_voice_play 语音播放
         */
        private String type;
        /**
         * 语音信息，utf-8/GBK 编码的 BASE64 编码字符串
         */
        private String voice;
        /**
         * 语音文件播放间隔
         */
        private Integer voice_interval;
        /**
         * 语音文件音量大小[1-100]
         */
        private Integer voice_volume;
        /**
         * 语音类型：0 男声；1 女声
         */
        private Integer voice_male;
    }

    @Data
    public static class IOCtrl {

        /**
         * Io out 的 id[0-3] 不同产品 io 个数不一样
         */
        private Integer io;
        /**
         * 输出 IO 的状态值
         * 0 断
         * 1 通
         * 2 先通后断
         */
        private Integer value;

        public void fromInternalIOCtrl(InternalIOValueEnum internalIOCtrl) {
            final ZSIOValueEnum zsioValueEnum = ZSIOValueEnum.fromInternalIOValueEnum(internalIOCtrl);
            this.value = zsioValueEnum == null ? null : zsioValueEnum.getCode();
        }

        /**
         * 先通后断的延迟时间(uint32，单位:ms)；当 value 为 2 的时候有效,最大 600*1000
         */
        private Integer delay;


    }

    @Getter
    @AllArgsConstructor
    public enum ZSIOValueEnum {
        UNDEFINED(Integer.MIN_VALUE, "找不到的类型"),
        OFF(0, "断"),
        ON(1, "通"),
        ON_AND_OF(2, "先通后断"),
        ;
        private final int code;
        private final String desc;

        public static ZSIOValueEnum codeOf(Integer code) {
            if (code == null) {
                return null;
            }
            for (ZSIOValueEnum color : values()) {
                if (color.code == code) {
                    return color;
                }
            }
            return null;
        }

        public static ZSIOValueEnum fromInternalIOValueEnum(InternalIOValueEnum internalIOValueEnum) {
            if (internalIOValueEnum == null) {
                return null;
            }
            return switch (internalIOValueEnum) {
                case OFF -> OFF;
                case ON -> ON;
                case ON_AND_OF -> ON_AND_OF;
                default -> UNDEFINED;
            };
        }
    }
}
